import fetch from 'node-fetch';
// 修改导入路径和函数名
import { renderAndSendMsgAuto } from '../resources/xr/xr.js';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import { createLogger } from '../modules/Logger.js'; 

// 获取当前文件的路径
const __filename = fileURLToPath(import.meta.url);
// 获取当前文件所在的目录
const __dirname = path.dirname(__filename);

// 保存绑定数据的文件路径
const DATA_DIR = path.resolve(__dirname, '../data/弹幕姬');
const BINDING_FILE = path.join(DATA_DIR, '绑定数据.json');
const BG_IMAGES_DIR = path.resolve(__dirname, '../data/背景图');
const BG_IMAGES_FILE = path.join(BG_IMAGES_DIR, 'square_images.json');

// 确保数据目录存在
if (!fs.existsSync(DATA_DIR)) {
  fs.mkdirSync(DATA_DIR);
}
if (!fs.existsSync(BG_IMAGES_DIR)) {
  fs.mkdirSync(BG_IMAGES_DIR);
}
if (!fs.existsSync(BG_IMAGES_FILE)) {
  fs.writeFileSync(BG_IMAGES_FILE, JSON.stringify([]));
}

const apiUrlBase = 'http://hh.hh2233.cn:10001/?json=1&roomid=';

class PippiLiveStatsPlugin extends plugin {
  constructor() {
    super({
      name: 'pippi_live_stats',
      dsc: '皮皮的直播状态',
      event: 'message',
      priority: 6,
      rule: [
        { reg: "^#绑定直播间([a-zA-Z0-9]+)$", fnc: 'bindLiveRoom', permission: 'all' },
        { reg: "^#查看绑定直播间$", fnc: 'viewBoundLiveRoom', permission: 'all' },
        { reg: "^#我的弹幕姬状态$", fnc: 'sendLiveStats', permission: 'all' },
        { reg: "^#弹幕姬状态([a-zA-Z0-9]+)$", fnc: 'sendLiveStats', permission: 'all' }
      ],
    });
    // 创建日志实例
    this.logger = createLogger(this.name);
  }

  async bindLiveRoom(e) {
    const liveRoomId = e.msg.match(/[a-zA-Z0-9]+/)[0];
    const userId = e.user_id.toString();

    // 加载绑定数据
    const bindingData = this.loadBinding();

    // 更新绑定数据，直接覆盖之前的绑定
    bindingData[userId] = liveRoomId;
    
    // 保存绑定数据到文件
    this.saveBinding(bindingData);

    await e.reply(`成功绑定直播间 ${liveRoomId}。`);
    this.logger.info(` 用户 ${userId} 绑定了直播间 ${liveRoomId}`);
  }

  async viewBoundLiveRoom(e) {
    const userId = e.user_id.toString();

    // 加载绑定数据
    const bindingData = this.loadBinding();

    if (bindingData[userId]) {
      await e.reply(`您当前绑定的直播间是：${bindingData[userId]}`);
    } else {
      await e.reply('您尚未绑定任何直播间。');
    }
  }

  // 统一处理 sendLiveStats，根据指令判断是查询绑定直播间还是指定直播间
  async sendLiveStats(e) {
    let roomid = null;

    // 判断指令类型，查询的是指定直播间还是绑定直播间
    if (e.msg.match(/^#弹幕姬状态([a-zA-Z0-9]+)$/)) {
      // 指令 #弹幕姬状态xxx：查询指定直播间状态
      roomid = e.msg.match(/^#弹幕姬状态([a-zA-Z0-9]+)$/)[1];
    } else if (e.msg === '#我的弹幕姬状态') {
      // 指令 #我的弹幕姬状态：查询绑定的直播间状态
      const userId = e.user_id.toString();
      const bindingData = this.loadBinding();

      if (bindingData[userId]) {
        roomid = bindingData[userId];
      } else {
        await e.reply('您尚未绑定任何直播间，请使用"#绑定直播间123456""#绑定直播间dy123456"进行绑定。');
        return;
      }
    } else {
      return; // 如果不是以上两种指令，则不处理
    }

    // 发送初始回复
    await e.reply(`正在获取直播间 ${roomid} 的弹幕姬状态，请稍等...`);

    try {
      // 调用 API 获取直播状态数据
      const data = await this.getLiveStats(roomid);

      // 获取音色延迟数据
      const ttsDelay = await this.getApiDelay('http://h3.hh2233.cn:3322/get_time', '音色服务器');
      const synthDelay = await this.getApiDelay('http://h3.hh2233.cn:3322/get_time?tts=1', '合成音色');

      // 构建消息内容
      let statsMsg = `用户名称: ${data['name']}\n`;
      statsMsg += `剩余时长: ${data['time']}\n`;
      statsMsg += `VIP 等级: ${data['VIP']}\n`;
      statsMsg += `开始时间: ${data['olddate']}\n`;
      statsMsg += `到期时间: ${data['newdate']}\n`;
      statsMsg += `下次重置时长: ${data['newtime']}\n`;
      statsMsg += `合成音色延迟: ${synthDelay}\n`;
      statsMsg += `音色服务器延迟: ${ttsDelay}\n`;

      // 获取随机背景图链接
      const imageUrl = this.getRandomBackgroundImage();

      // 修改渲染函数调用
      await renderAndSendMsgAuto(e, imageUrl, statsMsg, '皮皮的弹幕姬状态查询小工具', `直播间 ${roomid} 的详细状态信息`);

      // 输出普通日志
      this.logger.info(` 直播间 ${roomid} - 直播状态发送完成`);
    } catch (error) {
      // 输出错误日志
      this.logger.error(` 获取直播间 ${roomid} 的直播状态时发生错误: ${error.message}`);
      await e.reply('获取直播状态数据时发生错误，请稍后再试。');
    }
  }

  async getApiDelay(url, type) {
    const fetchWithTimeout = (url, timeout = 5000) => {
      return Promise.race([
        fetch(url),
        new Promise((_, reject) => setTimeout(() => reject(new Error('请求超时')), timeout))
      ]);
    };

    try {
      this.logger.info(` 正在请求 ${url}`);
      const response = await fetchWithTimeout(url);
      const data = await response.json();
      this.logger.info(` 获取 ${url} 的延迟完成`);
      return `${type}延迟: ${data.time || '未知'}`; // 返回延迟时间
    } catch (error) {
      this.logger.error(` 获取 ${url} 的延迟信息时发生错误: ${error.message}`);
      return `${type}延迟: 请求失败`;
    }
  }

  loadBinding() {
    if (fs.existsSync(BINDING_FILE)) {
      const data = fs.readFileSync(BINDING_FILE);
      return JSON.parse(data);
    }
    return {};
  }

  saveBinding(data) {
    fs.writeFileSync(BINDING_FILE, JSON.stringify(data, null, 2));
  }

  getRandomBackgroundImage() {
    const images = JSON.parse(fs.readFileSync(BG_IMAGES_FILE));
    if (images.length === 0) {
      return null;
    }
    const randomIndex = Math.floor(Math.random() * images.length);
    return images[randomIndex];
  }

  async getLiveStats(roomid) {
    const apiUrl = `${apiUrlBase}${roomid}`;
    const response = await fetch(apiUrl);
    const data = await response.json();
    return data;
  }
}

export default PippiLiveStatsPlugin;